library(plotly)
library(ggplot2)
library(grid)
#install.packages("gridExtra")
library(gridExtra)
#Age
ggplot(graphs) + geom_bar(aes(x = graphs$AGE_CAT), color = "navy", fill = "navy")+
      xlab("Age") + ylab("Number of Prisoners") + ggtitle("Age Distribution")

#Race
graphs$RACE <- full.numeric$RACE
ggplot(graphs) + geom_bar(aes(x = graphs$RACE), color = "navy", fill = "navy")+
      xlab("Race") + ylab("Number of Prisoners") + ggtitle("Distribution of Race") + 
      scale_x_discrete(labels=c("White", "Black", "Hispanic", "Indian", "Asian", "Multiple", "Missing"))

#Gender
ggplot(graphs) + geom_bar(aes(x = graphs$Gender), color = "navy", fill = "navy")+
      xlab("Gender") + ylab("Number of Prisoners") + ggtitle("Gender")

#Education
graphs$Education <- as.integer(graphs$Education)
    ggplot(graphs) + geom_bar(aes(x = graphs$Education), color = "navy", fill = "navy")+
    xlab("Education") + ylab("Number of Prisoners") + ggtitle("Education")

NA
#Recidivism
ggplot(graphs) + geom_bar(aes(x = graphs$CH_CRIMHIST_COLLAPSED), color = "navy", fill = "navy")+
  xlab("Recidivism") + ylab("Number of Prisoners") + ggtitle("Recidivism")   

#Prisoners with Incarcerated Parents
ggplot(graphs) + geom_bar(aes(x = graphs$SES_PARENTS_INCARCERATED), color = "navy", fill = "navy")+
  xlab("Parents Incarcerated") + ylab("Number of Prisoners") + ggtitle("Prisoners with Incarcerated Parents")

#Prisoners with Incarcerated Family Members
ggplot(graphs) + geom_bar(aes(x = graphs$SES_FAMILY_INCARCERATED), color = "navy", fill = "navy")+
  xlab("Family Incarcerated") + ylab("Number of Prisoners") + ggtitle("Prisoners with Incarcerated Family Members")

#Length of Sentence
ggplot(graphs) + geom_density(aes(x = graphs$CS_SENTENCEMTH), color = "navy", fill = "navy")+
  xlab("Sentence in Number of Months") + ylab("Number of Prisoners") + ggtitle("Length of Sentence") +
  coord_cartesian(xlim=c(0, 2000))

#Violent Offenses
ggplot(graphs) + geom_bar(aes(x = graphs$OFFENSE_VIOLENT), color = "navy", fill = "navy")+
  xlab("Violent Offenses") + ylab("Number of Prisoners") + ggtitle("Violent Offenses")

#Drug Offenses
ggplot(graphs) + geom_bar(aes(x = graphs$OFFENSE_DRUG), color = "navy", fill = "navy")+
  xlab("Drug Offenses") + ylab("Number of Prisoners") + ggtitle("Drug Offenses")

#Use Of Any Illegal Drug Regularly
ggplot(graphs) + geom_bar(aes(x = graphs$DRUG_ANYREG), color = "navy", fill = "navy")+
  xlab("Illegal Drug Use") + ylab("Number of Prisoners") + ggtitle("Use Of Any Illegal Drug Regularly")

#Sexual Abuse
ggplot(graphs) + geom_bar(aes(x = graphs$SES_SEXABUSED_EVER), color = "navy", fill = "navy")+
  xlab("Whether Sexually Abused") + ylab("Number of Prisoners") + ggtitle("Sexual Abuse")

#Physically Abused
ggplot(graphs) + geom_bar(aes(x = graphs$SES_PHYSABUSED_EVER), color = "navy", fill = "navy")+
  xlab("Physically Abused") + ylab("Number of Prisoners") + ggtitle("Physical Abuse")

#plotly
p <- plot_ly(x = graphs$SES_SEXABUSED_EVER, type = "histogram", name = 'Sexual Abuse') %>%
  add_histogram(x = graphs$SES_PHYSABUSED_EVER, name = 'Physical Abuse')%>%
  layout(title = "Sexual and Physical Abuse", 
         xaxis = list(title = "Type of Abuse"), 
                      yaxis = list(title = "Number of Prisoners"))
p
Ignoring 290 observationsIgnoring 250 observationsIgnoring 290 observationsIgnoring 250 observations
#Prisoners with Children
ggplot(graphs) + geom_bar(aes(x = graphs$SES_HASCHILDREN), color = "navy", fill = "navy")+
  xlab("Prisoners with Children") + ylab("Number of Prisoners") + ggtitle("Prisoners with Children")

#Prisoners with Minor Children
graphs$SES_NUMOFMINOR_CHILDREN <- full.numeric$SES_NUMOFMINOR_CHILDREN
graphs$SES_NUMOFMINOR_CHILDREN <- as.factor(graphs$SES_NUMOFMINOR_CHILDREN)
graphs$SES_NUMOFMINOR_CHILDREN <- as.integer(graphs$SES_NUMOFMINOR_CHILDREN)
graphs$SES_NUMOFMINOR_CHILDREN <- as.character(graphs$SES_NUMOFMINOR_CHILDREN)
ggplot(graphs) + geom_bar(aes(x = graphs$SES_NUMOFMINOR_CHILDREN), color = "navy", fill = "navy")+
  xlab("Number of Minor Children") + ylab("Number of Prisoners") + ggtitle("Prisoners with Minor Children")+
  scale_x_discrete(labels=c("0", "1", "2", "3", "4", "5", "6"))

#Length of Sentence and Recidivism
ggplot(graphs,aes(x=CS_SENTENCEMTH,y=CH_CRIMHIST_COLLAPSED)) +
  xlab("Length of Sentence") +
  ylab("Recidivism") +
  geom_point(alpha = 0.1, colour="navy",size=1) +
  geom_smooth() + xlab("Length of Sentence") +
  ylab("Recidivism") +
  ggtitle("Length of Sentence and Recidivism")

#Length of Sentence and Violent Offences
ggplot(graphs,aes(x=CS_SENTENCEMTH,y=OFFENSE_VIOLENT)) +
  xlab("Length of Sentence") +
  ylab("Violent Crimes") +
  geom_point(alpha = 0.1, colour="navy",size=1) +
  geom_smooth() + xlab("Length of Sentence") +
  ylab("Violent Crimes") +
  ggtitle("Length of Sentence and Violent Offences")

#Length of Sentence and Drug Offences
ggplot(graphs,aes(x=CS_SENTENCEMTH,y=OFFENSE_DRUG)) +
  xlab("Length of Sentence") +
  ylab("Drug Crimes") +
  geom_point(alpha = 0.1, colour="navy",size=1) +
  geom_smooth() + xlab("Length of Sentence") +
  ylab("Drug Crimes") +
  ggtitle("Length of Sentence and Drug Offences")

#Recidivism and Race
graphs$recidivism <- as.character(graphs$CH_CRIMHIST_COLLAPSED)
graphs$recidivism[graphs$recidivism == 0] <- NA
graphs$recidivism <- as.numeric(graphs$recidivism)
graphs$RACE <- as.numeric(graphs$RACE)
graphs$rac.rec <- graphs$RACE*graphs$recidivism
graphs$rac.rec <- as.factor(graphs$rac.rec)
rac.rec1 <- as.data.frame(na.omit(graphs$rac.rec))
ggplot(rac.rec1) + geom_bar(aes(x = rac.rec1$`na.omit(graphs$rac.rec)`), color = "navy", fill = "navy")+ xlab("Race") + ylab("Number of Recidivist Prisoners") + ggtitle("Race and Recidivism") + 
      scale_x_discrete(labels=c("White", "Black", "Hispanic", "Indian", "Asian", "Multiple", "Missing"))

#Education and Recidivism
graphs$Education <- as.numeric(graphs$Education)
graphs$Ed.rec <- graphs$Education*graphs$recidivism
graphs$Ed.rec <- as.factor(graphs$Ed.rec)
Ed.rec1 <- as.data.frame(na.omit(graphs$Ed.rec))
#graph1
ggplot(Ed.rec1) + geom_bar(aes(x = Ed.rec1$`na.omit(graphs$Ed.rec)`), color = "navy", fill = "navy")+ xlab("Education") + ylab("Number of Recidivist Prisoners") + ggtitle("Education and Recidivism") 

#graph2
ggplot(Ed.rec1) + geom_density(aes(x = Ed.rec1$`na.omit(graphs$Ed.rec)`), color = "navy", fill = "navy")+ xlab("Education") + ylab("Number of Recidivist Prisoners") + ggtitle("Education and Recidivism") 

#Different graphs?
#Recidivism and Drug Crimes
graphs$OFFENSE_DRUG <- as.numeric(graphs$OFFENSE_DRUG)
graphs$Drug.rec <- graphs$OFFENSE_DRUG*graphs$recidivism
graphs$Drug.rec <- as.factor(graphs$Drug.rec)
Drug.rec1 <- as.data.frame(na.omit(graphs$Drug.rec))
ggplot(Drug.rec1) + geom_bar(aes(x = Drug.rec1$`na.omit(graphs$Drug.rec)`), color = "navy", fill = "navy")+ xlab("Drug Crimes") + ylab("Number of Recidivist Prisoners") + ggtitle("Drug Crimes and Recidivism") 

#Recidivism and Violent Crimes
graphs$OFFENSE_VIOLENT <- as.numeric(graphs$OFFENSE_VIOLENT)
graphs$Violent.rec <- graphs$OFFENSE_VIOLENT*graphs$recidivism
graphs$Violent.rec <- as.factor(graphs$Violent.rec)
Violent.rec1 <- as.data.frame(na.omit(graphs$Violent.rec))
ggplot(Violent.rec1) + geom_bar(aes(x = Violent.rec1$`na.omit(graphs$Violent.rec)`), color = "navy", fill = "navy")+ xlab("Violent Crimes") + ylab("Number of Recidivist Prisoners") + ggtitle("Violent Crimes and Recidivism")

#Plotly
p <- plot_ly(x = graphs$Drug.rec, type = "histogram", name = 'Drug Crimes') %>%
  add_histogram(x = graphs$Violent.rec, name = 'ViolentCrimes')%>%
  layout(title = "Recidivism and Type of Crimes", 
         xaxis = list(title = "Recidivism"), 
                      yaxis = list(title = "Number of Prisoners"))
p
Ignoring 6042 observationsIgnoring 6042 observationsIgnoring 6042 observationsIgnoring 6042 observations
load("~/Desktop/model-errors.rdata")
p <- plot_ly(model.errors, y = ~error.full, type = 'scatter', mode = 'scatter', name = 'Full',
             line = list(color = 'rgb(205, 12, 24)', width = 4)) %>%
  add_trace(y = ~error.train, name = 'Train', line = list(color = 'rgb(22, 96, 167)', width = 4)) %>%
  add_trace(y = ~error.test, name = 'Test', line = list(color = 'rgb(30,144,70)', width = 4)) %>%
  add_trace(y = ~error.val, name = 'Validation', line = list(color = 'rgb(175, 90, 166)', width = 4)) %>%
  layout(title = "Error Lines",
         xaxis = list(title = "Models"),
         yaxis = list (title = "Mean Error Score"))
replacing previous import by ‘shiny::includeHTML’ when loading ‘crosstalk’replacing previous import by ‘shiny::knit_print.shiny.tag’ when loading ‘crosstalk’replacing previous import by ‘shiny::code’ when loading ‘crosstalk’replacing previous import by ‘shiny::includeScript’ when loading ‘crosstalk’replacing previous import by ‘shiny::includeMarkdown’ when loading ‘crosstalk’replacing previous import by ‘shiny::tags’ when loading ‘crosstalk’replacing previous import by ‘shiny::is.singleton’ when loading ‘crosstalk’replacing previous import by ‘shiny::withTags’ when loading ‘crosstalk’replacing previous import by ‘shiny::img’ when loading ‘crosstalk’replacing previous import by ‘shiny::tagAppendAttributes’ when loading ‘crosstalk’replacing previous import by ‘shiny::knit_print.shiny.tag.list’ when loading ‘crosstalk’replacing previous import by ‘shiny::knit_print.html’ when loading ‘crosstalk’replacing previous import by ‘shiny::tagAppendChild’ when loading ‘crosstalk’replacing previous import by ‘shiny::includeCSS’ when loading ‘crosstalk’replacing previous import by ‘shiny::br’ when loading ‘crosstalk’replacing previous import by ‘shiny::singleton’ when loading ‘crosstalk’replacing previous import by ‘shiny::span’ when loading ‘crosstalk’replacing previous import by ‘shiny::a’ when loading ‘crosstalk’replacing previous import by ‘shiny::tagList’ when loading ‘crosstalk’replacing previous import by ‘shiny::strong’ when loading ‘crosstalk’replacing previous import by ‘shiny::tag’ when loading ‘crosstalk’replacing previous import by ‘shiny::p’ when loading ‘crosstalk’replacing previous import by ‘shiny::validateCssUnit’ when loading ‘crosstalk’replacing previous import by ‘shiny::HTML’ when loading ‘crosstalk’replacing previous import by ‘shiny::h1’ when loading ‘crosstalk’replacing previous import by ‘shiny::h2’ when loading ‘crosstalk’replacing previous import by ‘shiny::h3’ when loading ‘crosstalk’replacing previous import by ‘shiny::h4’ when loading ‘crosstalk’replacing previous import by ‘shiny::h5’ when loading ‘crosstalk’replacing previous import by ‘shiny::h6’ when loading ‘crosstalk’replacing previous import by ‘shiny::tagAppendChildren’ when loading ‘crosstalk’replacing previous import by ‘shiny::em’ when loading ‘crosstalk’replacing previous import by ‘shiny::div’ when loading ‘crosstalk’replacing previous import by ‘shiny::pre’ when loading ‘crosstalk’replacing previous import by ‘shiny::htmlTemplate’ when loading ‘crosstalk’replacing previous import by ‘shiny::suppressDependencies’ when loading ‘crosstalk’replacing previous import by ‘shiny::tagSetChildren’ when loading ‘crosstalk’replacing previous import by ‘shiny::includeText’ when loading ‘crosstalk’replacing previous import by ‘shiny::hr’ when loading ‘crosstalk’
p
A line object has been specified, but lines is not in the mode
Adding lines to the mode...
A line object has been specified, but lines is not in the mode
Adding lines to the mode...
A line object has been specified, but lines is not in the mode
Adding lines to the mode...
A line object has been specified, but lines is not in the mode
Adding lines to the mode...
A line object has been specified, but lines is not in the mode
Adding lines to the mode...
A line object has been specified, but lines is not in the mode
Adding lines to the mode...
A line object has been specified, but lines is not in the mode
Adding lines to the mode...
A line object has been specified, but lines is not in the mode
Adding lines to the mode...
load("~/Desktop/model-errors.rdata")



p <- plot_ly(model.errors, y = ~error.full, type = 'scatter', mode = 'scatter', name = 'Full',
             line = list(color = 'rgb(205, 12, 24)', width = 4)) %>%
  add_trace(y = ~error.train, name = 'Train', line = list(color = 'rgb(22, 96, 167)', width = 4)) %>%
  add_trace(y = ~error.test, name = 'Test', line = list(color = 'rgb(30,144,70)', width = 4)) %>%
  add_trace(y = ~error.val, name = 'Validation', line = list(color = 'rgb(175, 90, 166)', width = 4)) %>%
  layout(title = "Error Lines",
         xaxis = list(title = "Models"),
         yaxis = list (title = "Mean Error Score"))
p

boxplot(CH_CRIMHIST_COLLAPSED~RACE, data=graphs, notch=TRUE, col=(c(“gold”,“darkgreen”)), main=“Recidivism and Race”, xlab=“”) ggplot(graphs,aes(x=RACE,y=CH_CRIMHIST_COLLAPSED)) + xlab(“Race”) + ylab(“Recidivism”) + geom_bar(alpha = 0.1, colour=“navy”,size=1) + geom_smooth() + xlab(“Race”) + ylab(“Recidivism”) + ggtitle(“Recidivism and Race”)

‘scatter’, ‘box’, ‘bar’, ‘heatmap’, ‘histogram’, ‘histogram2d’, ‘histogram2dcontour’, ‘pie’, ‘contour’, ‘scatterternary’, ‘scatter3d’, ‘surface’, ‘mesh3d’, ‘scattergeo’, ‘choropleth’, ‘scattergl’, ‘pointcloud’, ‘heatmapgl’, ‘parcoords’, ‘scattermapbox’, ‘carpet’, ‘scattercarpet’, ‘contourcarpet’, ‘ohlc’, ‘candlestick’, ‘area’ ```

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).

LS0tCnRpdGxlOiAiVmlzdWFsaXphdGlvbnMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCgoKYGBgYGBge0RhdGF9CmxvYWQoIn4vRGVza3RvcC9jbGVhbi5kYXRhLlJEYXRhIikKCmdyYXBocyA8LSBkYXRhLmZyYW1lKGZ1bGwubnVtZXJpYyRJRCwgZnVsbC5udW1lcmljJENIX0NSSU1ISVNUX0NPTExBUFNFRCwgZnVsbC5udW1lcmljJE9GRkVOU0VfVklPTEVOVCwgCiAgICAgICAgICAgIGZ1bGwubnVtZXJpYyRPRkZFTlNFX0RSVUcsIGZ1bGwubnVtZXJpYyRTRVNfUEhZU0FCVVNFRF9FVkVSLCBmdWxsLm51bWVyaWMkQ1NfU0VOVEVOQ0VNVEgsIAogICAgICAgICAgICBmdWxsLm51bWVyaWMkU0VTX1BBUkVOVFNfSU5DQVJDRVJBVEVELCBmdWxsLm51bWVyaWMkU0VTX0ZBTUlMWV9JTkNBUkNFUkFURUQsIGZ1bGwubnVtZXJpYyRTRVNfSEFTQ0hJTERSRU4sCiAgICAgICAgICAgIGZ1bGwubnVtZXJpYyRBR0VfQ0FULCBmdWxsLm51bWVyaWMkU0VTX1NFWEFCVVNFRF9FVkVSLCBmdWxsLm51bWVyaWMkRFJVR19BTllSRUcsIGZ1bGwubnVtZXJpYyREUlVHX0FOWVRNRSwKICAgICAgICAgICAgZnVsbC5udW1lcmljJGJsYWNrLm5oLCBmdWxsLm51bWVyaWMkaGlzcGFuaWMsIGZ1bGwubnVtZXJpYyRhc2lhbiwgZnVsbC5udW1lcmljJHN0YXRlKQpncmFwaHMkRWR1Y2F0aW9uIDwtIGZ1bGwubnVtZXJpYyRFRFVDQVRJT04KZ3JhcGhzJEdlbmRlciA8LSBmdWxsLm51bWVyaWMkR0VOREVSCgpjb2xuYW1lcyhncmFwaHMpIDwtIGdzdWIoImZ1bGwubnVtZXJpYy4iLCAiIiwgY29sbmFtZXMoZ3JhcGhzKSkKYGBgCgpgYGB7cn0KbGlicmFyeShwbG90bHkpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShncmlkKQojaW5zdGFsbC5wYWNrYWdlcygiZ3JpZEV4dHJhIikKbGlicmFyeShncmlkRXh0cmEpCgojQWdlCmdncGxvdChncmFwaHMpICsgZ2VvbV9iYXIoYWVzKHggPSBncmFwaHMkQUdFX0NBVCksIGNvbG9yID0gIm5hdnkiLCBmaWxsID0gIm5hdnkiKSsKICAgICAgeGxhYigiQWdlIikgKyB5bGFiKCJOdW1iZXIgb2YgUHJpc29uZXJzIikgKyBnZ3RpdGxlKCJBZ2UgRGlzdHJpYnV0aW9uIikKCiNSYWNlCmdyYXBocyRSQUNFIDwtIGZ1bGwubnVtZXJpYyRSQUNFCmdncGxvdChncmFwaHMpICsgZ2VvbV9iYXIoYWVzKHggPSBncmFwaHMkUkFDRSksIGNvbG9yID0gIm5hdnkiLCBmaWxsID0gIm5hdnkiKSsKICAgICAgeGxhYigiUmFjZSIpICsgeWxhYigiTnVtYmVyIG9mIFByaXNvbmVycyIpICsgZ2d0aXRsZSgiRGlzdHJpYnV0aW9uIG9mIFJhY2UiKSArIAogICAgICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJXaGl0ZSIsICJCbGFjayIsICJIaXNwYW5pYyIsICJJbmRpYW4iLCAiQXNpYW4iLCAiTXVsdGlwbGUiLCAiTWlzc2luZyIpKQoKI0dlbmRlcgpnZ3Bsb3QoZ3JhcGhzKSArIGdlb21fYmFyKGFlcyh4ID0gZ3JhcGhzJEdlbmRlciksIGNvbG9yID0gIm5hdnkiLCBmaWxsID0gIm5hdnkiKSsKICAgICAgeGxhYigiR2VuZGVyIikgKyB5bGFiKCJOdW1iZXIgb2YgUHJpc29uZXJzIikgKyBnZ3RpdGxlKCJHZW5kZXIiKQoKI0VkdWNhdGlvbgpncmFwaHMkRWR1Y2F0aW9uIDwtIGFzLmludGVnZXIoZ3JhcGhzJEVkdWNhdGlvbikKICAgIGdncGxvdChncmFwaHMpICsgZ2VvbV9iYXIoYWVzKHggPSBncmFwaHMkRWR1Y2F0aW9uKSwgY29sb3IgPSAibmF2eSIsIGZpbGwgPSAibmF2eSIpKwogICAgeGxhYigiRWR1Y2F0aW9uIikgKyB5bGFiKCJOdW1iZXIgb2YgUHJpc29uZXJzIikgKyBnZ3RpdGxlKCJFZHVjYXRpb24iKQogICAgCmBgYAoKYGBge3J9CiNSZWNpZGl2aXNtCmdncGxvdChncmFwaHMpICsgZ2VvbV9iYXIoYWVzKHggPSBncmFwaHMkQ0hfQ1JJTUhJU1RfQ09MTEFQU0VEKSwgY29sb3IgPSAibmF2eSIsIGZpbGwgPSAibmF2eSIpKwogIHhsYWIoIlJlY2lkaXZpc20iKSArIHlsYWIoIk51bWJlciBvZiBQcmlzb25lcnMiKSArIGdndGl0bGUoIlJlY2lkaXZpc20iKSAgIAoKI1ByaXNvbmVycyB3aXRoIEluY2FyY2VyYXRlZCBQYXJlbnRzCmdncGxvdChncmFwaHMpICsgZ2VvbV9iYXIoYWVzKHggPSBncmFwaHMkU0VTX1BBUkVOVFNfSU5DQVJDRVJBVEVEKSwgY29sb3IgPSAibmF2eSIsIGZpbGwgPSAibmF2eSIpKwogIHhsYWIoIlBhcmVudHMgSW5jYXJjZXJhdGVkIikgKyB5bGFiKCJOdW1iZXIgb2YgUHJpc29uZXJzIikgKyBnZ3RpdGxlKCJQcmlzb25lcnMgd2l0aCBJbmNhcmNlcmF0ZWQgUGFyZW50cyIpCgojUHJpc29uZXJzIHdpdGggSW5jYXJjZXJhdGVkIEZhbWlseSBNZW1iZXJzCmdncGxvdChncmFwaHMpICsgZ2VvbV9iYXIoYWVzKHggPSBncmFwaHMkU0VTX0ZBTUlMWV9JTkNBUkNFUkFURUQpLCBjb2xvciA9ICJuYXZ5IiwgZmlsbCA9ICJuYXZ5IikrCiAgeGxhYigiRmFtaWx5IEluY2FyY2VyYXRlZCIpICsgeWxhYigiTnVtYmVyIG9mIFByaXNvbmVycyIpICsgZ2d0aXRsZSgiUHJpc29uZXJzIHdpdGggSW5jYXJjZXJhdGVkIEZhbWlseSBNZW1iZXJzIikKCiNMZW5ndGggb2YgU2VudGVuY2UKZ2dwbG90KGdyYXBocykgKyBnZW9tX2RlbnNpdHkoYWVzKHggPSBncmFwaHMkQ1NfU0VOVEVOQ0VNVEgpLCBjb2xvciA9ICJuYXZ5IiwgZmlsbCA9ICJuYXZ5IikrCiAgeGxhYigiU2VudGVuY2UgaW4gTnVtYmVyIG9mIE1vbnRocyIpICsgeWxhYigiTnVtYmVyIG9mIFByaXNvbmVycyIpICsgZ2d0aXRsZSgiTGVuZ3RoIG9mIFNlbnRlbmNlIikgKwogIGNvb3JkX2NhcnRlc2lhbih4bGltPWMoMCwgMjAwMCkpCgpgYGAKCmBgYHtyfQojVmlvbGVudCBPZmZlbnNlcwpnZ3Bsb3QoZ3JhcGhzKSArIGdlb21fYmFyKGFlcyh4ID0gZ3JhcGhzJE9GRkVOU0VfVklPTEVOVCksIGNvbG9yID0gIm5hdnkiLCBmaWxsID0gIm5hdnkiKSsKICB4bGFiKCJWaW9sZW50IE9mZmVuc2VzIikgKyB5bGFiKCJOdW1iZXIgb2YgUHJpc29uZXJzIikgKyBnZ3RpdGxlKCJWaW9sZW50IE9mZmVuc2VzIikKCiNEcnVnIE9mZmVuc2VzCmdncGxvdChncmFwaHMpICsgZ2VvbV9iYXIoYWVzKHggPSBncmFwaHMkT0ZGRU5TRV9EUlVHKSwgY29sb3IgPSAibmF2eSIsIGZpbGwgPSAibmF2eSIpKwogIHhsYWIoIkRydWcgT2ZmZW5zZXMiKSArIHlsYWIoIk51bWJlciBvZiBQcmlzb25lcnMiKSArIGdndGl0bGUoIkRydWcgT2ZmZW5zZXMiKQoKI1VzZSBPZiBBbnkgSWxsZWdhbCBEcnVnIFJlZ3VsYXJseQpnZ3Bsb3QoZ3JhcGhzKSArIGdlb21fYmFyKGFlcyh4ID0gZ3JhcGhzJERSVUdfQU5ZUkVHKSwgY29sb3IgPSAibmF2eSIsIGZpbGwgPSAibmF2eSIpKwogIHhsYWIoIklsbGVnYWwgRHJ1ZyBVc2UiKSArIHlsYWIoIk51bWJlciBvZiBQcmlzb25lcnMiKSArIGdndGl0bGUoIlVzZSBPZiBBbnkgSWxsZWdhbCBEcnVnIFJlZ3VsYXJseSIpCgpgYGAKCmBgYHtyfQoKI1NleHVhbCBBYnVzZQpnZ3Bsb3QoZ3JhcGhzKSArIGdlb21fYmFyKGFlcyh4ID0gZ3JhcGhzJFNFU19TRVhBQlVTRURfRVZFUiksIGNvbG9yID0gIm5hdnkiLCBmaWxsID0gIm5hdnkiKSsKICB4bGFiKCJXaGV0aGVyIFNleHVhbGx5IEFidXNlZCIpICsgeWxhYigiTnVtYmVyIG9mIFByaXNvbmVycyIpICsgZ2d0aXRsZSgiU2V4dWFsIEFidXNlIikKCiNQaHlzaWNhbGx5IEFidXNlZApnZ3Bsb3QoZ3JhcGhzKSArIGdlb21fYmFyKGFlcyh4ID0gZ3JhcGhzJFNFU19QSFlTQUJVU0VEX0VWRVIpLCBjb2xvciA9ICJuYXZ5IiwgZmlsbCA9ICJuYXZ5IikrCiAgeGxhYigiUGh5c2ljYWxseSBBYnVzZWQiKSArIHlsYWIoIk51bWJlciBvZiBQcmlzb25lcnMiKSArIGdndGl0bGUoIlBoeXNpY2FsIEFidXNlIikKCiNwbG90bHkKcCA8LSBwbG90X2x5KHggPSBncmFwaHMkU0VTX1NFWEFCVVNFRF9FVkVSLCB0eXBlID0gImhpc3RvZ3JhbSIsIG5hbWUgPSAnU2V4dWFsIEFidXNlJykgJT4lCiAgYWRkX2hpc3RvZ3JhbSh4ID0gZ3JhcGhzJFNFU19QSFlTQUJVU0VEX0VWRVIsIG5hbWUgPSAnUGh5c2ljYWwgQWJ1c2UnKSU+JQogIGxheW91dCh0aXRsZSA9ICJTZXh1YWwgYW5kIFBoeXNpY2FsIEFidXNlIiwgCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJUeXBlIG9mIEFidXNlIiksIAogICAgICAgICAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIk51bWJlciBvZiBQcmlzb25lcnMiKSkKcApgYGAKCmBgYHtyfQojUHJpc29uZXJzIHdpdGggQ2hpbGRyZW4KZ2dwbG90KGdyYXBocykgKyBnZW9tX2JhcihhZXMoeCA9IGdyYXBocyRTRVNfSEFTQ0hJTERSRU4pLCBjb2xvciA9ICJuYXZ5IiwgZmlsbCA9ICJuYXZ5IikrCiAgeGxhYigiUHJpc29uZXJzIHdpdGggQ2hpbGRyZW4iKSArIHlsYWIoIk51bWJlciBvZiBQcmlzb25lcnMiKSArIGdndGl0bGUoIlByaXNvbmVycyB3aXRoIENoaWxkcmVuIikKCiNQcmlzb25lcnMgd2l0aCBNaW5vciBDaGlsZHJlbgpncmFwaHMkU0VTX05VTU9GTUlOT1JfQ0hJTERSRU4gPC0gZnVsbC5udW1lcmljJFNFU19OVU1PRk1JTk9SX0NISUxEUkVOCmdyYXBocyRTRVNfTlVNT0ZNSU5PUl9DSElMRFJFTiA8LSBhcy5mYWN0b3IoZ3JhcGhzJFNFU19OVU1PRk1JTk9SX0NISUxEUkVOKQpncmFwaHMkU0VTX05VTU9GTUlOT1JfQ0hJTERSRU4gPC0gYXMuaW50ZWdlcihncmFwaHMkU0VTX05VTU9GTUlOT1JfQ0hJTERSRU4pCmdyYXBocyRTRVNfTlVNT0ZNSU5PUl9DSElMRFJFTiA8LSBhcy5jaGFyYWN0ZXIoZ3JhcGhzJFNFU19OVU1PRk1JTk9SX0NISUxEUkVOKQoKZ2dwbG90KGdyYXBocykgKyBnZW9tX2JhcihhZXMoeCA9IGdyYXBocyRTRVNfTlVNT0ZNSU5PUl9DSElMRFJFTiksIGNvbG9yID0gIm5hdnkiLCBmaWxsID0gIm5hdnkiKSsKICB4bGFiKCJOdW1iZXIgb2YgTWlub3IgQ2hpbGRyZW4iKSArIHlsYWIoIk51bWJlciBvZiBQcmlzb25lcnMiKSArIGdndGl0bGUoIlByaXNvbmVycyB3aXRoIE1pbm9yIENoaWxkcmVuIikrCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIpKQoKYGBgCgpgYGB7cn0KI0xlbmd0aCBvZiBTZW50ZW5jZSBhbmQgUmVjaWRpdmlzbQpnZ3Bsb3QoZ3JhcGhzLGFlcyh4PUNTX1NFTlRFTkNFTVRILHk9Q0hfQ1JJTUhJU1RfQ09MTEFQU0VEKSkgKwogIHhsYWIoIkxlbmd0aCBvZiBTZW50ZW5jZSIpICsKICB5bGFiKCJSZWNpZGl2aXNtIikgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjEsIGNvbG91cj0ibmF2eSIsc2l6ZT0xKSArCiAgZ2VvbV9zbW9vdGgoKSArIHhsYWIoIkxlbmd0aCBvZiBTZW50ZW5jZSIpICsKICB5bGFiKCJSZWNpZGl2aXNtIikgKwogIGdndGl0bGUoIkxlbmd0aCBvZiBTZW50ZW5jZSBhbmQgUmVjaWRpdmlzbSIpCgojTGVuZ3RoIG9mIFNlbnRlbmNlIGFuZCBWaW9sZW50IE9mZmVuY2VzCmdncGxvdChncmFwaHMsYWVzKHg9Q1NfU0VOVEVOQ0VNVEgseT1PRkZFTlNFX1ZJT0xFTlQpKSArCiAgeGxhYigiTGVuZ3RoIG9mIFNlbnRlbmNlIikgKwogIHlsYWIoIlZpb2xlbnQgQ3JpbWVzIikgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjEsIGNvbG91cj0ibmF2eSIsc2l6ZT0xKSArCiAgZ2VvbV9zbW9vdGgoKSArIHhsYWIoIkxlbmd0aCBvZiBTZW50ZW5jZSIpICsKICB5bGFiKCJWaW9sZW50IENyaW1lcyIpICsKICBnZ3RpdGxlKCJMZW5ndGggb2YgU2VudGVuY2UgYW5kIFZpb2xlbnQgT2ZmZW5jZXMiKQoKI0xlbmd0aCBvZiBTZW50ZW5jZSBhbmQgRHJ1ZyBPZmZlbmNlcwpnZ3Bsb3QoZ3JhcGhzLGFlcyh4PUNTX1NFTlRFTkNFTVRILHk9T0ZGRU5TRV9EUlVHKSkgKwogIHhsYWIoIkxlbmd0aCBvZiBTZW50ZW5jZSIpICsKICB5bGFiKCJEcnVnIENyaW1lcyIpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC4xLCBjb2xvdXI9Im5hdnkiLHNpemU9MSkgKwogIGdlb21fc21vb3RoKCkgKyB4bGFiKCJMZW5ndGggb2YgU2VudGVuY2UiKSArCiAgeWxhYigiRHJ1ZyBDcmltZXMiKSArCiAgZ2d0aXRsZSgiTGVuZ3RoIG9mIFNlbnRlbmNlIGFuZCBEcnVnIE9mZmVuY2VzIikKYGBgCmBgYHtyfQojUmVjaWRpdmlzbSBhbmQgUmFjZQoKZ3JhcGhzJHJlY2lkaXZpc20gPC0gYXMuY2hhcmFjdGVyKGdyYXBocyRDSF9DUklNSElTVF9DT0xMQVBTRUQpCmdyYXBocyRyZWNpZGl2aXNtW2dyYXBocyRyZWNpZGl2aXNtID09IDBdIDwtIE5BCmdyYXBocyRyZWNpZGl2aXNtIDwtIGFzLm51bWVyaWMoZ3JhcGhzJHJlY2lkaXZpc20pCmdyYXBocyRSQUNFIDwtIGFzLm51bWVyaWMoZ3JhcGhzJFJBQ0UpCmdyYXBocyRyYWMucmVjIDwtIGdyYXBocyRSQUNFKmdyYXBocyRyZWNpZGl2aXNtCmdyYXBocyRyYWMucmVjIDwtIGFzLmZhY3RvcihncmFwaHMkcmFjLnJlYykKCnJhYy5yZWMxIDwtIGFzLmRhdGEuZnJhbWUobmEub21pdChncmFwaHMkcmFjLnJlYykpCgpnZ3Bsb3QocmFjLnJlYzEpICsgZ2VvbV9iYXIoYWVzKHggPSByYWMucmVjMSRgbmEub21pdChncmFwaHMkcmFjLnJlYylgKSwgY29sb3IgPSAibmF2eSIsIGZpbGwgPSAibmF2eSIpKyB4bGFiKCJSYWNlIikgKyB5bGFiKCJOdW1iZXIgb2YgUmVjaWRpdmlzdCBQcmlzb25lcnMiKSArIGdndGl0bGUoIlJhY2UgYW5kIFJlY2lkaXZpc20iKSArIAogICAgICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJXaGl0ZSIsICJCbGFjayIsICJIaXNwYW5pYyIsICJJbmRpYW4iLCAiQXNpYW4iLCAiTXVsdGlwbGUiLCAiTWlzc2luZyIpKQoKYGBgCmBgYHtyfQojRWR1Y2F0aW9uIGFuZCBSZWNpZGl2aXNtCmdyYXBocyRFZHVjYXRpb24gPC0gYXMubnVtZXJpYyhncmFwaHMkRWR1Y2F0aW9uKQpncmFwaHMkRWQucmVjIDwtIGdyYXBocyRFZHVjYXRpb24qZ3JhcGhzJHJlY2lkaXZpc20KZ3JhcGhzJEVkLnJlYyA8LSBhcy5mYWN0b3IoZ3JhcGhzJEVkLnJlYykKCkVkLnJlYzEgPC0gYXMuZGF0YS5mcmFtZShuYS5vbWl0KGdyYXBocyRFZC5yZWMpKQoKI2dyYXBoMQpnZ3Bsb3QoRWQucmVjMSkgKyBnZW9tX2JhcihhZXMoeCA9IEVkLnJlYzEkYG5hLm9taXQoZ3JhcGhzJEVkLnJlYylgKSwgY29sb3IgPSAibmF2eSIsIGZpbGwgPSAibmF2eSIpKyB4bGFiKCJFZHVjYXRpb24iKSArIHlsYWIoIk51bWJlciBvZiBSZWNpZGl2aXN0IFByaXNvbmVycyIpICsgZ2d0aXRsZSgiRWR1Y2F0aW9uIGFuZCBSZWNpZGl2aXNtIikgCgojZ3JhcGgyCmdncGxvdChFZC5yZWMxKSArIGdlb21fZGVuc2l0eShhZXMoeCA9IEVkLnJlYzEkYG5hLm9taXQoZ3JhcGhzJEVkLnJlYylgKSwgY29sb3IgPSAibmF2eSIsIGZpbGwgPSAibmF2eSIpKyB4bGFiKCJFZHVjYXRpb24iKSArIHlsYWIoIk51bWJlciBvZiBSZWNpZGl2aXN0IFByaXNvbmVycyIpICsgZ2d0aXRsZSgiRWR1Y2F0aW9uIGFuZCBSZWNpZGl2aXNtIikgCgojRGlmZmVyZW50IGdyYXBocz8KCmBgYAoKYGBge3J9CiNSZWNpZGl2aXNtIGFuZCBEcnVnIENyaW1lcwpncmFwaHMkT0ZGRU5TRV9EUlVHIDwtIGFzLm51bWVyaWMoZ3JhcGhzJE9GRkVOU0VfRFJVRykKZ3JhcGhzJERydWcucmVjIDwtIGdyYXBocyRPRkZFTlNFX0RSVUcqZ3JhcGhzJHJlY2lkaXZpc20KZ3JhcGhzJERydWcucmVjIDwtIGFzLmZhY3RvcihncmFwaHMkRHJ1Zy5yZWMpCgpEcnVnLnJlYzEgPC0gYXMuZGF0YS5mcmFtZShuYS5vbWl0KGdyYXBocyREcnVnLnJlYykpCgpnZ3Bsb3QoRHJ1Zy5yZWMxKSArIGdlb21fYmFyKGFlcyh4ID0gRHJ1Zy5yZWMxJGBuYS5vbWl0KGdyYXBocyREcnVnLnJlYylgKSwgY29sb3IgPSAibmF2eSIsIGZpbGwgPSAibmF2eSIpKyB4bGFiKCJEcnVnIENyaW1lcyIpICsgeWxhYigiTnVtYmVyIG9mIFJlY2lkaXZpc3QgUHJpc29uZXJzIikgKyBnZ3RpdGxlKCJEcnVnIENyaW1lcyBhbmQgUmVjaWRpdmlzbSIpIAoKI1JlY2lkaXZpc20gYW5kIFZpb2xlbnQgQ3JpbWVzCmdyYXBocyRPRkZFTlNFX1ZJT0xFTlQgPC0gYXMubnVtZXJpYyhncmFwaHMkT0ZGRU5TRV9WSU9MRU5UKQpncmFwaHMkVmlvbGVudC5yZWMgPC0gZ3JhcGhzJE9GRkVOU0VfVklPTEVOVCpncmFwaHMkcmVjaWRpdmlzbQpncmFwaHMkVmlvbGVudC5yZWMgPC0gYXMuZmFjdG9yKGdyYXBocyRWaW9sZW50LnJlYykKClZpb2xlbnQucmVjMSA8LSBhcy5kYXRhLmZyYW1lKG5hLm9taXQoZ3JhcGhzJFZpb2xlbnQucmVjKSkKCmdncGxvdChWaW9sZW50LnJlYzEpICsgZ2VvbV9iYXIoYWVzKHggPSBWaW9sZW50LnJlYzEkYG5hLm9taXQoZ3JhcGhzJFZpb2xlbnQucmVjKWApLCBjb2xvciA9ICJuYXZ5IiwgZmlsbCA9ICJuYXZ5IikrIHhsYWIoIlZpb2xlbnQgQ3JpbWVzIikgKyB5bGFiKCJOdW1iZXIgb2YgUmVjaWRpdmlzdCBQcmlzb25lcnMiKSArIGdndGl0bGUoIlZpb2xlbnQgQ3JpbWVzIGFuZCBSZWNpZGl2aXNtIikKCiNQbG90bHkKcCA8LSBwbG90X2x5KHggPSBncmFwaHMkRHJ1Zy5yZWMsIHR5cGUgPSAiaGlzdG9ncmFtIiwgbmFtZSA9ICdEcnVnIENyaW1lcycpICU+JQogIGFkZF9oaXN0b2dyYW0oeCA9IGdyYXBocyRWaW9sZW50LnJlYywgbmFtZSA9ICdWaW9sZW50Q3JpbWVzJyklPiUKICBsYXlvdXQodGl0bGUgPSAiUmVjaWRpdmlzbSBhbmQgVHlwZSBvZiBDcmltZXMiLCAKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIlJlY2lkaXZpc20iKSwgCiAgICAgICAgICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTnVtYmVyIG9mIFByaXNvbmVycyIpKQpwCgpgYGAKCgpgYGB7cn0KbG9hZCgifi9EZXNrdG9wL21vZGVsLWVycm9ycy5yZGF0YSIpCgoKCnAgPC0gcGxvdF9seShtb2RlbC5lcnJvcnMsIHkgPSB+ZXJyb3IuZnVsbCwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdzY2F0dGVyJywgbmFtZSA9ICdGdWxsJywKICAgICAgICAgICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYigyMDUsIDEyLCAyNCknLCB3aWR0aCA9IDQpKSAlPiUKICBhZGRfdHJhY2UoeSA9IH5lcnJvci50cmFpbiwgbmFtZSA9ICdUcmFpbicsIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYigyMiwgOTYsIDE2NyknLCB3aWR0aCA9IDQpKSAlPiUKICBhZGRfdHJhY2UoeSA9IH5lcnJvci50ZXN0LCBuYW1lID0gJ1Rlc3QnLCBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2IoMzAsMTQ0LDcwKScsIHdpZHRoID0gNCkpICU+JQogIGFkZF90cmFjZSh5ID0gfmVycm9yLnZhbCwgbmFtZSA9ICdWYWxpZGF0aW9uJywgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiKDE3NSwgOTAsIDE2NiknLCB3aWR0aCA9IDQpKSAlPiUKICBsYXlvdXQodGl0bGUgPSAiRXJyb3IgTGluZXMiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTW9kZWxzIiksCiAgICAgICAgIHlheGlzID0gbGlzdCAodGl0bGUgPSAiTWVhbiBFcnJvciBTY29yZSIpKQpwCgpgYGAKCgoKCmJveHBsb3QoQ0hfQ1JJTUhJU1RfQ09MTEFQU0VEflJBQ0UsIGRhdGE9Z3JhcGhzLCBub3RjaD1UUlVFLCAKICBjb2w9KGMoImdvbGQiLCJkYXJrZ3JlZW4iKSksCiAgbWFpbj0iUmVjaWRpdmlzbSBhbmQgUmFjZSIsIHhsYWI9IiIpCmdncGxvdChncmFwaHMsYWVzKHg9UkFDRSx5PUNIX0NSSU1ISVNUX0NPTExBUFNFRCkpICsKICB4bGFiKCJSYWNlIikgKwogIHlsYWIoIlJlY2lkaXZpc20iKSArCiAgZ2VvbV9iYXIoYWxwaGEgPSAwLjEsIGNvbG91cj0ibmF2eSIsc2l6ZT0xKSArCiAgZ2VvbV9zbW9vdGgoKSArIAogIHhsYWIoIlJhY2UiKSArIHlsYWIoIlJlY2lkaXZpc20iKSArCiAgZ2d0aXRsZSgiUmVjaWRpdmlzbSBhbmQgUmFjZSIpCiAgCiAgJ3NjYXR0ZXInLCAnYm94JywgJ2JhcicsICdoZWF0bWFwJywgJ2hpc3RvZ3JhbScsICdoaXN0b2dyYW0yZCcsICdoaXN0b2dyYW0yZGNvbnRvdXInLCAncGllJywgJ2NvbnRvdXInLCAnc2NhdHRlcnRlcm5hcnknLCAnc2NhdHRlcjNkJywgJ3N1cmZhY2UnLCAnbWVzaDNkJywgJ3NjYXR0ZXJnZW8nLCAnY2hvcm9wbGV0aCcsICdzY2F0dGVyZ2wnLCAncG9pbnRjbG91ZCcsICdoZWF0bWFwZ2wnLCAncGFyY29vcmRzJywgJ3NjYXR0ZXJtYXBib3gnLCAnY2FycGV0JywgJ3NjYXR0ZXJjYXJwZXQnLCAnY29udG91cmNhcnBldCcsICdvaGxjJywgJ2NhbmRsZXN0aWNrJywgJ2FyZWEnCmBgYAoKQWRkIGEgbmV3IGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqSW5zZXJ0IENodW5rKiBidXR0b24gb24gdGhlIHRvb2xiYXIgb3IgYnkgcHJlc3NpbmcgKkNtZCtPcHRpb24rSSouCgoKV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDbWQrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4K